home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / macros.inc < prev    next >
Encoding:
Text File  |  1994-10-30  |  7.8 KB  |  278 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : macros.inc
  4. ; Included from: Your Program
  5. ; Description  : Macros used throughout
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28. pushw    macro ww                           ; push word, used for pushing constants
  29.          mov ax,ww
  30.          push ax
  31.          endm
  32.  
  33. ; macro to out a 16 bit value to an i/o port
  34.  
  35. out_16   macro register, value
  36.          ifdifi <register>, <dx>            ; if dx not setup
  37.          mov dx, register                   ; then select register
  38.          endif
  39.          ifdifi <value>, <ax>               ; if ax not setup
  40.          mov ax, value                      ; then get data value
  41.          endif
  42.          out dx, ax                         ; set i/o register(s)
  43. endm
  44.  
  45. ; macro to out a 8 bit value to an i/o port
  46.  
  47. out_8    macro register, value
  48.          ifdifi <register>, <dx>            ; if dx not setup
  49.          mov dx, register                   ; then select register
  50.          endif
  51.          ifdifi <value>, <al>               ; if al not setup
  52.          mov al, value                      ; then get data value
  53.          endif
  54.          out dx, al                         ; set i/o register
  55. endm
  56.  
  57. ; macro to multiply by a constant - this can be done because of protected
  58. ; mode's lea function.
  59. ;
  60. ; use: cmul eax,ecx,12   eax=ecx*12
  61. ; as opposed to using imul
  62.  
  63. cmul     macro result,value,constant        ; constant multiply, use fast lea
  64.  
  65.          if constant eq 7
  66.          lea result,[value*4+value]         ; 7 = %0111
  67.          shl value,1
  68.          add result,value
  69.          cdq
  70.  
  71.          elseif constant eq 8
  72.          lea result,[value*8]               ; 8 = %1000
  73.          cdq
  74.  
  75.          elseif constant eq 9
  76.          lea result,[value*8+value]         ; 9 = %1001
  77.          cdq
  78.  
  79.          elseif constant eq 10
  80.          shl value,1
  81.          lea result,[value*4+value]         ; 10 = %1010
  82.          cdq
  83.  
  84.          elseif constant eq 11
  85.          lea result,[value*2+value]         ; 11 = %1011
  86.          shl value,3
  87.          add result,value
  88.          cdq
  89.  
  90.          elseif constant eq 12
  91.          lea result,[value*2+value]         ; 12 = %1100
  92.          shl result,2
  93.          cdq
  94.  
  95.          elseif constant eq 13
  96.          lea result,[value*2+value]         ; 13 = %1101
  97.          shl result,2
  98.          add result,value
  99.          cdq
  100.  
  101.          elseif constant eq 14
  102.          lea result,[value*8]               ; 14 = %1110
  103.          lea result,[result*2]
  104.          sub result,value
  105.          sub result,value
  106.          cdq
  107.  
  108.          elseif constant eq 15
  109.          lea result,[value*8]               ; 15 = %1111
  110.          lea result,[result*2]
  111.          sub result,value
  112.          cdq
  113.  
  114.          elseif constant eq 31
  115.          lea result,[value*8]               ; 31 = %1 1111
  116.          lea result,[result*4]
  117.          sub result,value
  118.          cdq
  119.  
  120.          elseif constant eq 63
  121.          lea result,[value*8]               ; 63 = %11 1111
  122.          lea result,[result*8]
  123.          sub result,value
  124.          cdq
  125.  
  126.          elseif constant eq 80
  127.          lea result,[value*4+value]         ; 80 = %0101 0000
  128.          shl result,4
  129.          cdq
  130.  
  131.          elseif constant eq 240
  132.          shl value,4
  133.          lea result,[value*4+value]         ; 240 = %0 1111 0000
  134.          shl value,1
  135.          lea value,[value*4+value]
  136.          add result,value
  137.          cdq
  138.  
  139.          elseif constant eq 260
  140.          lea result,[value*4]               ; 260 = %1 0000 0100
  141.          shl value,8
  142.          add result,value
  143.          cdq
  144.  
  145.          elseif constant eq 280
  146.          shl value,3
  147.          lea result,[value*2+value]         ; 240 = %1 0001 1000
  148.          shl value,5
  149.          add result,value
  150.          cdq
  151.  
  152.          elseif constant eq 300
  153.          shl value,2
  154.          lea result,[value*2+value]         ; 300 = %1 0010 1100
  155.          shl value,3
  156.          lea value,[value*8+value]
  157.          add result,value
  158.          cdq
  159.  
  160.          elseif constant eq 320
  161.          lea result,[value*4+value]         ; 320 = %1 0100 0000
  162.          shl result,6
  163.          cdq
  164.  
  165.          elseif constant eq 360
  166.          shl value,3
  167.          lea result,[value*4+value]         ; 360 = %1 0110 1000
  168.          shl value,3
  169.          lea value,[value*4+value]
  170.          add result,value
  171.          cdq
  172.  
  173.          elseif constant eq 416
  174.          shl value,5
  175.          lea result,[value*4+value]         ; 416 = %1 1010 0000
  176.          shl value,3
  177.          add result,value
  178.          cdq
  179.  
  180.          elseif constant eq 448
  181.          lea result,[value*8]               ; 464 = %1 1100 0000
  182.          shl value,2
  183.          lea value,[value*4+value]
  184.          add result,value
  185.          shl result,4
  186.          cdq
  187.  
  188.          elseif constant eq 464
  189.          lea result,[value*8+value]         ; 464 = %1 1101 0000
  190.          shl value,2
  191.          lea value,[value*4+value]
  192.          add result,value
  193.          shl result,4
  194.          cdq
  195.  
  196.          elseif constant eq 480
  197.          shl value,5
  198.          lea result,[value*4+value]         ; 480 = %1 1110 0000
  199.          shl value,1
  200.          lea value,[value*4+value]
  201.          add result,value
  202.          cdq
  203.  
  204.          elseif constant eq 1440
  205.          shl value,5
  206.          lea result,[value*4+value]         ; 1440 = 480 * 3
  207.          shl value,1
  208.          lea value,[value*4+value]
  209.          add result,value
  210.          lea result,[result*2+result]
  211.          cdq
  212.  
  213.          elseif constant eq 2980h
  214.          shl value,7
  215.          lea result,[value*2+value]         ; 2980 = %10 1001 1000 0000
  216.          shl value,4
  217.          lea value,[value*4+value]
  218.          add result,value
  219.          cdq
  220.  
  221.          elseif constant eq 2d00h
  222.          shl value,8                        ; 2d41/4000h = cos(45degrees) = sin(45)
  223.          lea result,[value*4+value]         ; 2d00h = %0010 1101 0000 0000
  224.          shl value,3                        ; 2d41/2d00 = 99.2% correct!
  225.          lea value,[value*4+value]
  226.          add result,value
  227.          cdq
  228.  
  229.          else
  230.          mov result,constant
  231.          imul value
  232.          display "Note: Slow multiplication used in constant multiply"
  233.          display " See cmul macro in file macros.inc"
  234.          endif
  235.  
  236. endm
  237.  
  238. ; convert 16-bit segment, 16-bit offset to 32-bit flat pointer
  239. ; ( segment, offset in 32-bit registers OR immediate values )
  240.  
  241. segoff2ptr macro ptr32, seg16, off16
  242.          mov &ptr32, &seg16
  243.          shl &ptr32, 4
  244.          add &ptr32, &off16
  245.          sub &ptr32, _code32a
  246.          endm
  247.  
  248. ; convert 32-bit flat pointer to 16-bit segment, 16-bit offset
  249. ; ( segment, offset in 32-bit registers )
  250.  
  251. ptr2segoff macro ptr32, seg16, off16
  252.          add &ptr32, _code32a
  253.          mov &off16, &ptr32
  254.          and &off16, 0ffffh
  255.          mov &seg16, &ptr32
  256.          shr &seg16, 4
  257.          and &seg16, 0f000h
  258.          endm
  259.  
  260. ; wait for escape key
  261.  
  262. waitesc  macro
  263.          local lab1, lab2
  264. lab1:    in al, 60h
  265.          cmp al, 1
  266.          jne lab1
  267. lab2:    in al, 60h
  268.          cmp al, 1
  269.          je lab2
  270.          endm
  271.  
  272.          b equ byte ptr
  273.          w equ word ptr
  274.          d equ dword ptr
  275.          o equ offset
  276.          s equ short
  277.  
  278.